home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / The Hacks! / Spotlight Hack / source / 68KPatch.c next >
Encoding:
C/C++ Source or Header  |  1998-06-21  |  4.5 KB  |  151 lines  |  [TEXT/CWIE]

  1. // 68KPatch.c
  2.  
  3. #include <A4Stuff.h>
  4. #include "main.h"
  5.  
  6. SpotlightGlobals *globptr;
  7.  
  8. pascal UInt32 (*gKeyTranslateAddr)(const void *transData, UInt16 keycode, UInt32 *state);
  9. pascal UInt32 MyKeyTranslate(const void *transData, UInt16 keycode, UInt32 *state);
  10.  
  11. pascal Boolean (*gOSEventAvailAddr)(register EventMask mask:__D0, register EventRecord *event:__A0) : __D0;
  12. #pragma parameter __D0 MyOSEventAvail(__D0, __A0)
  13. pascal Boolean MyOSEventAvail(EventMask mask, EventRecord *event);
  14.  
  15. #define _DragDispatch 0xABED
  16. asm void MyDragDispatchASM(void);
  17. pascal OSErr MyDrawingProc(DragRegionMessage message, RgnHandle showRegion, Point showOrigin, RgnHandle hideRegion, Point hideOrigin, void *dragDrawingRefCon, DragReference theDrag);
  18.  
  19. pascal void (*gModalDialogAddr)(ModalFilterUPP modalFilter, DialogItemIndex *itemHit);
  20. pascal void MyModalDialog(ModalFilterUPP modalFilter, DialogItemIndex *itemHit);
  21.  
  22. void main(SpotlightGlobals *glob) {
  23.     EnterCodeResource();
  24.     
  25.     globptr = glob;
  26.  
  27.     gKeyTranslateAddr = (void*)NGetTrapAddress(_KeyTranslate, ToolTrap);
  28.     NSetTrapAddress((ProcPtr)MyKeyTranslate, _KeyTranslate, ToolTrap);
  29.  
  30.     gOSEventAvailAddr = (void*)NGetTrapAddress(_OSEventAvail, OSTrap);
  31.     NSetTrapAddress((ProcPtr)MyOSEventAvail, _OSEventAvail, OSTrap);
  32.  
  33.     globptr->myDrawUPP = NewDragDrawingProc(MyDrawingProc);
  34.     globptr->dragDispatchAddr = NGetTrapAddress(_DragDispatch, ToolTrap);
  35.     *(long*)((long)MyDragDispatchASM + 2) = (long)globptr;
  36.     NSetTrapAddress((ProcPtr)MyDragDispatchASM, _DragDispatch, ToolTrap);
  37.  
  38.     gModalDialogAddr = (void*)NGetTrapAddress(_ModalDialog, ToolTrap);
  39.     NSetTrapAddress((ProcPtr)MyModalDialog, _ModalDialog, ToolTrap);
  40.     
  41.     ExitCodeResource();
  42. }
  43.  
  44. pascal UInt32 MyKeyTranslate(const void *transData, UInt16 keycode, UInt32 *state) {
  45.     UInt32 charCode;
  46.     EnterCodeResource();
  47.     
  48.     if (globptr->active) {
  49.         // clear modifier bits so we can type normally 
  50.         // (for renaming stuff etc.)
  51.         
  52.         keycode &= ~globptr->prefs.disableModifiers;
  53.     }
  54.     charCode = gKeyTranslateAddr(transData, keycode, state);
  55.     
  56.     ExitCodeResource();
  57.     return charCode;
  58. }
  59.  
  60. pascal Boolean MyOSEventAvail(register EventMask mask:__D0, register EventRecord *event:__A0) : __D0
  61. {
  62.     Boolean gotEvent;
  63.     EnterCodeResource();
  64.     
  65.     gotEvent = gOSEventAvailAddr(mask, event);
  66.     if (globptr->active) {
  67.         // clear modifier bits so we can do other stuff normally 
  68.         // (for dragging icons etc.)
  69.         
  70.         event->modifiers &= ~globptr->prefs.disableModifiers;
  71.     }
  72.         
  73.     ExitCodeResource();
  74.     return gotEvent;
  75. }
  76.  
  77. asm void MyDragDispatchASM(void) {
  78.     bra @start
  79.  
  80. globdata: dc.l 0
  81.  
  82. @start:
  83.     // store the globals which we will need regardless
  84.     move.l globdata, a0
  85.     // see if it's SetDragDrawingProc
  86.     cmpi.w #0x000C, d0
  87.     bne @callOriginal
  88.  
  89.     // see if the spotlight is active
  90.     move.l struct(SpotlightGlobals.active)(a0), d1
  91.     btst #24, d1
  92.     beq @callOriginal
  93.  
  94.     // patch
  95.     // clear the deactivating variable
  96.     move.l #0, struct(SpotlightGlobals.deactivating)(a0)
  97.     // store their UPP
  98.     move.l 8(sp), struct(SpotlightGlobals.theirDrawUPP)(a0)
  99.     // put in our UPP
  100.     move.l struct(SpotlightGlobals.myDrawUPP)(a0), 8(sp)
  101.     
  102. @callOriginal:
  103.     move.l struct(SpotlightGlobals.dragDispatchAddr)(a0), -(sp)
  104.     rts
  105. }
  106.  
  107. #define modKeysDown(modifiers) ((modifiers & globptr->prefs.activateModifiers) == globptr->prefs.activateModifiers)
  108.  
  109. pascal OSErr MyDrawingProc(
  110.     DragRegionMessage message, RgnHandle showRegion, 
  111.     Point showOrigin, RgnHandle hideRegion, Point hideOrigin, 
  112.     void *dragDrawingRefCon, DragReference theDrag)
  113. {
  114.     OSErr err;
  115.     EnterCodeResource();
  116.  
  117.     if (!globptr->deactivating) {
  118.         QElemPtr eventInQueue;
  119.         EventRecord event;
  120.         
  121.         // we cannot check the modifiers in the proceeding loop because not all events are
  122.         // put in the system event queue (e.g., null events)
  123.         gOSEventAvailAddr(everyEvent, &event);
  124.         if (!modKeysDown(event.modifiers)) globptr->deactivating = true;
  125.  
  126.         CALL_TWO_PARAMETER_UPP(globptr->showSpotlightUPP, uppShowSpotlightInfo, showOrigin, true);
  127.         for (    eventInQueue = LMGetEventQueue()->qHead; 
  128.                 eventInQueue != nil; 
  129.                 eventInQueue = eventInQueue->qLink) 
  130.         {
  131.             if (modKeysDown(((EvQElPtr)eventInQueue)->evtQModifiers))
  132.                 ((EvQElPtr)eventInQueue)->evtQModifiers &= ~globptr->prefs.disableModifiers;
  133.         }
  134.         //SystemTask();
  135.     }
  136.  
  137.     err = CallDragDrawingProc(globptr->theirDrawUPP, message, showRegion, showOrigin, 
  138.         hideRegion, hideOrigin, dragDrawingRefCon, theDrag);
  139.  
  140.     ExitCodeResource();
  141.     return err;
  142. }
  143.  
  144. pascal void MyModalDialog(ModalFilterUPP modalFilter, DialogItemIndex *itemHit) {
  145.     EnterCodeResource();
  146.     
  147.     globptr->lastModalDialog = FrontWindow();
  148.     gModalDialogAddr(modalFilter, itemHit);
  149.     
  150.     ExitCodeResource();
  151. }